Modifying the
dataset
Bringing in the
datasets
To work with the Countries dataset, we will be bringing in Country
Info from my github. We will also be limiting it to 2015 for our plot of
life expectancy and income in 2015.
Countries<-read.csv(file="https://dannyoc99.github.io/DOCAL/dataset/Country%20Info.csv")
Countries_2015<-filter(Countries,year==2015)%>%mutate(PolutionK=pop/1000)
Looking into the 2015
dataset
DT::datatable(Countries_2015, fillContainer = FALSE, options = list(pageLength = 11))
Graphing Life
Expectancy and Income during 2015
plot.life<-Countries_2015$lifeExp
plot.pop<-Countries_2015$PolutionK
plot.region<-Countries_2015$continent
plot.gdp<-Countries_2015$gdpPercap
sizeref <- max(plot.pop)/1000
plot_ly(
data = Countries_2015,
x = ~plot.life, # Horizontal axis
y = ~plot.gdp, # Vertical axis
color = ~factor(plot.region), # must be a numeric factor
hovertext = ~Countries_2015$Country,
text= ~Countries_2015$pop, # show the species in the hover text
## using the following hovertemplate() to add the information of the
## Two numerical variables to the hover text.
hovertemplate = paste('<i><b>Income<b></i>: %{y}',
'<br><b>Life Expectancy</b>: %{x}',
'<br><b>Population: %{text}</b>',
'<br><b>Country: %{hovertext}</b>'),
alpha = 0.9,
marker = list(size = ~plot.pop, sizemode = 'area',sizeref=sizeref, opacity=0.5,fill='tozeroy' ),
type = "scatter",
mode = "markers",
## graphic size
width = 700,
height = 500) %>%
layout(
### Title
title =list(text = "Life Expectancy vs Income in 2015",
font = list(family = "Times New Roman", # HTML font family
size = 18,
color = "red")),
### legend
legend = list(title = list(text = 'Continent',
font = list(family = "Courier New",
size = 14,
color = "green")),
bgcolor = "ivory",
bordercolor = "navy",
groupclick = "togglegroup", # one of "toggleitem" AND "togglegroup".
orientation = "v" # Sets the orientation of the legend.
), ## Background
plot_bgcolor ='#f7f7f7',
## Axes labels
xaxis = list(
title=list(text = 'Life Expectancy',
font = list(family = 'Arial')),
zerolinecolor = 'red',
zerolinewidth = 2,
gridcolor = 'white'),
yaxis = list(
title=list(text = 'Income',
font = list(family = 'Arial')),
zerolinecolor = 'purple',
zerolinewidth = 2,
gridcolor = 'white'),
## annotations
annotations = list(
x = .4, # between 0 and 1. 0 = left, 1 = right
y = .9, # between 0 and 1, 0 = bottom, 1 = top
font = list(size = 12,
color = "darkred"),
text = "The point size
is proportional
to the population size
",
xref = "paper", # "container" spans the entire `width` of the
# lot. "paper" refers to the width of the
# plotting area only. yref = "paper",
# same as xref.
xanchor = "center", # horizontal alignment with respect to its x position
yanchor = "bottom", # similar to xanchor
showarrow = FALSE))
Looking at the graph, we have a scatter plot of Life Expectancy and
Income. By adding the continent as a color reference and population size
as a size reference we can get a 4D look at a 2D plot. From this view,
we can see that African Countries consistently have lower life
expectancy. Additionally, we can see an exponential relationship between
life expectancy and income. Additionally we can see that European
countries have more consistent population sizes than the other
continents. Finally, the graph lets us see that the GDP Per Capita has a
very large margin, as most of the countries do not even make it to the
first tick mark of the graph showing many outlier countries in terms of
GDP.
Animatee Life
Expectancies vs Income
plot.life<-Countries$lifeExp
plot.pop<-Countries$pop
plot.region<-Countries$continent
plot.gdp<-Countries$gdpPercap
plot.year<-Countries$year
pal.IBM <- c("#332288", "#117733", "#0072B2","#D55E00", "#882255")
pal.IBM <- setNames(pal.IBM, c("Asia", "Europe", "Africa", "Americas", "Oceania"))
fig <- Countries %>%
plot_ly(
x = ~plot.gdp,
y = ~plot.life,
size = ~(2*log(plot.pop)-11)^2,
color = ~plot.region,
colors = pal.IBM, # custom colors
#marker = list(size = ~(log(pop)-10), sizemode = 'area'),
frame = ~plot.year, # the time variable to
# to display in the hover
text = ~paste("Country:", Country,
"<br>Continent:", continent,
"<br>Year:", year,
"<br>LifeExp:", lifeExp,
"<br>Pop:", pop,
"<br>gdpPerCap:", gdpPercap),
hoverinfo = "text",
type = 'scatter',
mode = 'markers'
)
fig <- fig %>%
layout(
### Title
title =list(text = "Life Expectancy vs Income in 2015",
font = list(family = "Times New Roman", # HTML font family
size = 18,
color = "red")),
## Axes labels
xaxis = list(
title=list(text = 'Income',
font = list(family = 'Arial')),
zerolinewidth = 2,
gridcolor = 'white'),
yaxis = list(
title=list(text = 'Life Expectancy',
font = list(family = 'Arial')),
zerolinewidth = 2,
gridcolor = 'white')
)
fig
By animating the graph, we have yet another dimension added to our
2-D graph, year. Whilst all of the 2015 conclusions hold mostly the
same, something interesting about the year factor is that GDP and income
was not always an exponential relationship. By increasing the years and
starting at a base, we can see it used to be more of a cluster of points
without a real pattern, and the closer to the present we get, the
stronger that exponential relationship gets.
Looking at the mean
population size across Continents in 2015
barplotdata = aggregate(Countries_2015[,6], by = list(Countries_2015$continent), FUN = mean)
plot_ly(
data = barplotdata,
x = ~Group.1,
y = ~x,
type = "bar",
name = "Average Population Size by Country",
## graphic size
width = 700,
height = 400) %>%
layout( yaxis = list(title ="Mean"),
xaxis = list(title = "Continent"),
title = "Average Population Size by Country",
## margin of the plot
margin = list(
b = 50,
l = 100,
t = 120,
r = 50
))
Overall, I think it is quite hard to gain extremely valuable
information out of the sizes of marks on a scatter plot, so I thought I
would make the box plot for mean population size per continent to better
see this relationship. Overall, we get a lot more data from this box
plot. We can see that Asia has the highest average population size,
Oceania has the smallest, and Africa and Europe have quite similar
averages.
LS0tDQp0aXRsZTogIkhvbWV3b3JrIDY6IFBsb3R0aW5nIExpZmUgRXhwZWN0YW5jeSBhbmQgSW5jb21lIHVzaW5nIFBsb3RseSINCmF1dGhvcjogIkRhbmllbCBPQ2FsbGFnaGFuIg0KZGF0ZTogIiINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGZpZ193aWR0aDogNg0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHRydWUNCiAgICB0aGVtZTogcmVhZGFibGUNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogNQ0KICAgIGZpZ19oZWlnaHQ6IDQNCi0tLQ0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KLyogVGFibGUgb2YgY29udGVudCAtIG5hdmlnYXRpb24gKi8NCmRpdiNUT0MgbGkgew0KICAgIGxpc3Qtc3R5bGU6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCiAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgICBjb2xvcjogbGlnaHRibHVlOw0KfQ0KDQpoMS50aXRsZSB7DQogIGZvbnQtc2l6ZTogMjRweDsNCiAgY29sb3I6IE5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogYmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBibHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMSB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMnB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBibHVlOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgyIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IE5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTVweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogTmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBOYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQo8L3N0eWxlPg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCm9wdGlvbnMocmVwb3MgPSBsaXN0KENSQU49Imh0dHA6Ly9jcmFuLnJzdHVkaW8uY29tLyIpKQ0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCiAgIGxpYnJhcnkodGlkeXZlcnNlKQ0KfQ0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJjb3dwbG90IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImNvd3Bsb3QiKQ0KICAgbGlicmFyeShjb3dwbG90KQ0KfQ0KaWYgKCFyZXF1aXJlKCJsYXRleDJleHAiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygibGF0ZXgyZXhwIikNCiAgIGxpYnJhcnkobGF0ZXgyZXhwKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwbG90bHkiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCiAgIGxpYnJhcnkocGxvdGx5KQ0KfQ0KaWYgKCFyZXF1aXJlKCJnYXBtaW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiZ2FwbWluZGVyIikNCiAgIGxpYnJhcnkoZ2FwbWluZGVyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwbmciKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInBuZyIpICAgIA0KICAgIGxpYnJhcnkoInBuZyIpDQp9DQppZiAoIXJlcXVpcmUoIlJDdXJsIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJSQ3VybCIpICAgIA0KICAgIGxpYnJhcnkoIlJDdXJsIikNCn0NCmlmICghcmVxdWlyZSgiY29sb3VycGlja2VyIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJjb2xvdXJwaWNrZXIiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiY29sb3VycGlja2VyIikNCn0NCmlmICghcmVxdWlyZSgiZ2dhbmltYXRlIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnZ2FuaW1hdGUiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2dhbmltYXRlIikNCn0NCmlmICghcmVxdWlyZSgiZ2lmc2tpIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnaWZza2kiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2lmc2tpIikNCn0NCmlmICghcmVxdWlyZSgibWFnaWNrIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJtYWdpY2siKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibWFnaWNrIikNCn0NCmlmICghcmVxdWlyZSgiZ3JEZXZpY2VzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnckRldmljZXMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ3JEZXZpY2VzIikNCn0NCmlmICghcmVxdWlyZSgianBlZyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygianBlZyIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJqcGVnIikNCn0NCmlmICghcmVxdWlyZSgiZ2dyaWRnZXMiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImdncmlkZ2VzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdncmlkZ2VzIikNCn0NCmlmICghcmVxdWlyZSgicGx5ciIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygicGx5ciIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJwbHlyIikNCn0NCmlmICghcmVxdWlyZSgiZ2dpcmFwaCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dpcmFwaCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJnZ2lyYXBoIikNCn0NCmlmICghcmVxdWlyZSgiaGlnaGNoYXJ0ZXIiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImhpZ2hjaGFydGVyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImhpZ2hjaGFydGVyIikNCn0NCmlmICghcmVxdWlyZSgiZm9yZWNhc3QiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImZvcmVjYXN0IikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImZvcmVjYXN0IikNCn0NCiMjIA0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFJVRSwgICANCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BKQ0KYGBgDQoNCg0KDQojIE1vZGlmeWluZyB0aGUgZGF0YXNldA0KDQojIyBCcmluZ2luZyBpbiB0aGUgZGF0YXNldHMgDQoNClRvIHdvcmsgd2l0aCB0aGUgQ291bnRyaWVzIGRhdGFzZXQsIHdlIHdpbGwgYmUgYnJpbmdpbmcgaW4gQ291bnRyeSBJbmZvIGZyb20gbXkgZ2l0aHViLiBXZSB3aWxsIGFsc28gYmUgbGltaXRpbmcgaXQgdG8gMjAxNSBmb3Igb3VyIHBsb3Qgb2YgbGlmZSBleHBlY3RhbmN5IGFuZCBpbmNvbWUgaW4gMjAxNS4gDQpgYGB7ciBkYXRhc2V0fQ0KQ291bnRyaWVzPC1yZWFkLmNzdihmaWxlPSJodHRwczovL2Rhbm55b2M5OS5naXRodWIuaW8vRE9DQUwvZGF0YXNldC9Db3VudHJ5JTIwSW5mby5jc3YiKQ0KQ291bnRyaWVzXzIwMTU8LWZpbHRlcihDb3VudHJpZXMseWVhcj09MjAxNSklPiVtdXRhdGUoUG9sdXRpb25LPXBvcC8xMDAwKQ0KYGBgDQoNCiMgTG9va2luZyBpbnRvIHRoZSAyMDE1IGRhdGFzZXQNCg0KYGBge3IgZGF0YX0NCkRUOjpkYXRhdGFibGUoQ291bnRyaWVzXzIwMTUsIGZpbGxDb250YWluZXIgPSBGQUxTRSwgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDExKSkNCmBgYA0KDQojIEdyYXBoaW5nIExpZmUgRXhwZWN0YW5jeSBhbmQgSW5jb21lIGR1cmluZyAyMDE1DQoNCmBgYHtyIDIwMTVwbG90fQ0KcGxvdC5saWZlPC1Db3VudHJpZXNfMjAxNSRsaWZlRXhwDQpwbG90LnBvcDwtQ291bnRyaWVzXzIwMTUkUG9sdXRpb25LDQpwbG90LnJlZ2lvbjwtQ291bnRyaWVzXzIwMTUkY29udGluZW50DQpwbG90LmdkcDwtQ291bnRyaWVzXzIwMTUkZ2RwUGVyY2FwDQpzaXplcmVmIDwtIG1heChwbG90LnBvcCkvMTAwMA0KcGxvdF9seSgNCiAgICBkYXRhID0gQ291bnRyaWVzXzIwMTUsDQogICAgeCA9IH5wbG90LmxpZmUsICAjIEhvcml6b250YWwgYXhpcyANCiAgICB5ID0gfnBsb3QuZ2RwLCAgICMgVmVydGljYWwgYXhpcyANCiAgICBjb2xvciA9IH5mYWN0b3IocGxvdC5yZWdpb24pLCAgIyBtdXN0IGJlIGEgbnVtZXJpYyBmYWN0b3INCiAgICAgaG92ZXJ0ZXh0ID0gfkNvdW50cmllc18yMDE1JENvdW50cnksDQogICAgICB0ZXh0PSB+Q291bnRyaWVzXzIwMTUkcG9wLCAgICAgIyBzaG93IHRoZSBzcGVjaWVzIGluIHRoZSBob3ZlciB0ZXh0DQogICAgICMjIHVzaW5nIHRoZSBmb2xsb3dpbmcgaG92ZXJ0ZW1wbGF0ZSgpIHRvIGFkZCB0aGUgaW5mb3JtYXRpb24gb2YgdGhlDQogICAgICMjIFR3byBudW1lcmljYWwgdmFyaWFibGVzIHRvIHRoZSBob3ZlciB0ZXh0Lg0KICAgICBob3ZlcnRlbXBsYXRlID0gcGFzdGUoJzxpPjxiPkluY29tZTxiPjwvaT46ICV7eX0nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxicj48Yj5MaWZlIEV4cGVjdGFuY3k8L2I+OiAgJXt4fScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJyPjxiPlBvcHVsYXRpb246ICV7dGV4dH08L2I+JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+PGI+Q291bnRyeTogJXtob3ZlcnRleHR9PC9iPicpLA0KICAgICBhbHBoYSAgPSAwLjksDQogICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IH5wbG90LnBvcCwgc2l6ZW1vZGUgPSAnYXJlYScsc2l6ZXJlZj1zaXplcmVmLCBvcGFjaXR5PTAuNSxmaWxsPSd0b3plcm95JyApLA0KICAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgICBtb2RlID0gIm1hcmtlcnMiLA0KICAgICAjIyBncmFwaGljIHNpemUNCiAgICAgd2lkdGggPSA3MDAsDQogICAgaGVpZ2h0ID0gNTAwKSAlPiUNCiAgICAgIGxheW91dCggIA0KICAgICAgIyMjIFRpdGxlIA0KICAgICAgdGl0bGUgPWxpc3QodGV4dCA9ICJMaWZlIEV4cGVjdGFuY3kgdnMgSW5jb21lIGluIDIwMTUiLCANCiAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJUaW1lcyBOZXcgUm9tYW4iLCAgIyBIVE1MIGZvbnQgZmFtaWx5ICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDE4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gInJlZCIpKSwgDQogICAgICAjIyMgbGVnZW5kDQogICAgICBsZWdlbmQgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gJ0NvbnRpbmVudCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiQ291cmllciBOZXciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMTQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiZ3JlZW4iKSksDQogICAgICAgICAgICAgICAgICAgIGJnY29sb3IgPSAiaXZvcnkiLA0KICAgICAgICAgICAgICAgICAgICBib3JkZXJjb2xvciA9ICJuYXZ5IiwNCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBjbGljayA9ICJ0b2dnbGVncm91cCIsICAjIG9uZSBvZiAgInRvZ2dsZWl0ZW0iIEFORCAidG9nZ2xlZ3JvdXAiLg0KICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9ICJ2IiAgIyBTZXRzIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgbGVnZW5kLg0KICAgICAgICAgICAgICAgICAgICApLCAgICAgICMjIEJhY2tncm91bmQNCiAgICAgIHBsb3RfYmdjb2xvciA9JyNmN2Y3ZjcnLCANCiAgICAgICMjIEF4ZXMgbGFiZWxzDQogICAgICAgICAgICAgeGF4aXMgPSBsaXN0KCANCiAgICAgICAgICAgICAgICAgICAgdGl0bGU9bGlzdCh0ZXh0ID0gJ0xpZmUgRXhwZWN0YW5jeScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gJ0FyaWFsJykpLA0KICAgICAgICAgICAgICAgICAgICB6ZXJvbGluZWNvbG9yID0gJ3JlZCcsIA0KICAgICAgICAgICAgICAgICAgICB6ZXJvbGluZXdpZHRoID0gMiwgDQogICAgICAgICAgICAgICAgICAgIGdyaWRjb2xvciA9ICd3aGl0ZScpLCANCiAgICAgICAgICAgIHlheGlzID0gbGlzdCggDQogICAgICAgICAgICAgICAgICAgIHRpdGxlPWxpc3QodGV4dCA9ICdJbmNvbWUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICdBcmlhbCcpKSwNCiAgICAgICAgICAgICAgICAgICAgemVyb2xpbmVjb2xvciA9ICdwdXJwbGUnLCANCiAgICAgICAgICAgICAgICAgICAgemVyb2xpbmV3aWR0aCA9IDIsIA0KICAgICAgICAgICAgICAgICAgICBncmlkY29sb3IgPSAnd2hpdGUnKSwNCiAgICAgICAjIyBhbm5vdGF0aW9ucw0KICAgICAgIGFubm90YXRpb25zID0gbGlzdCggIA0KICAgICAgICAgICAgICAgICAgICAgeCA9IC40LCAgICMgYmV0d2VlbiAwIGFuZCAxLiAwID0gbGVmdCwgMSA9IHJpZ2h0DQogICAgICAgICAgICAgICAgICAgICB5ID0gLjksICAgIyBiZXR3ZWVuIDAgYW5kIDEsIDAgPSBib3R0b20sIDEgPSB0b3ANCiAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KHNpemUgPSAxMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gImRhcmtyZWQiKSwgICANCiAgICAgICAgICAgICAgICAgIHRleHQgPSAiVGhlIHBvaW50IHNpemUgDQogICAgICAgICAgaXMgcHJvcG9ydGlvbmFsIA0KICAgICAgICAgICAgICB0byB0aGUgcG9wdWxhdGlvbiBzaXplDQogICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAiLCAgIA0KICAgICAgICAgICAgICAgICAgeHJlZiA9ICJwYXBlciIsICAjICJjb250YWluZXIiIHNwYW5zIHRoZSBlbnRpcmUgYHdpZHRoYCBvZiB0aGUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIGxvdC4gInBhcGVyIiByZWZlcnMgdG8gdGhlIHdpZHRoIG9mIHRoZSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgcGxvdHRpbmcgYXJlYSBvbmx5LiB5cmVmID0gInBhcGVyIiwgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBzYW1lIGFzIHhyZWYuDQogICAgICAgICAgICAgICB4YW5jaG9yID0gImNlbnRlciIsICMgIGhvcml6b250YWwgYWxpZ25tZW50IHdpdGggcmVzcGVjdCB0byBpdHMgeCBwb3NpdGlvbg0KICAgICAgICAgICAgICAgeWFuY2hvciA9ICJib3R0b20iLCAjICBzaW1pbGFyIHRvIHhhbmNob3IgIA0KICAgICAgICAgICAgIHNob3dhcnJvdyA9IEZBTFNFKSkNCmBgYA0KDQpMb29raW5nIGF0IHRoZSBncmFwaCwgd2UgaGF2ZSBhIHNjYXR0ZXIgcGxvdCBvZiBMaWZlIEV4cGVjdGFuY3kgYW5kIEluY29tZS4gQnkgYWRkaW5nIHRoZSBjb250aW5lbnQgYXMgYSBjb2xvciByZWZlcmVuY2UgYW5kIHBvcHVsYXRpb24gc2l6ZSBhcyBhIHNpemUgcmVmZXJlbmNlIHdlIGNhbiBnZXQgYSA0RCBsb29rIGF0IGEgMkQgcGxvdC4gRnJvbSB0aGlzIHZpZXcsIHdlIGNhbiBzZWUgdGhhdCBBZnJpY2FuIENvdW50cmllcyBjb25zaXN0ZW50bHkgaGF2ZSBsb3dlciBsaWZlIGV4cGVjdGFuY3kuIEFkZGl0aW9uYWxseSwgd2UgY2FuIHNlZSBhbiBleHBvbmVudGlhbCByZWxhdGlvbnNoaXAgYmV0d2VlbiBsaWZlIGV4cGVjdGFuY3kgYW5kIGluY29tZS4gQWRkaXRpb25hbGx5IHdlIGNhbiBzZWUgdGhhdCBFdXJvcGVhbiBjb3VudHJpZXMgaGF2ZSBtb3JlIGNvbnNpc3RlbnQgcG9wdWxhdGlvbiBzaXplcyB0aGFuIHRoZSBvdGhlciBjb250aW5lbnRzLiBGaW5hbGx5LCB0aGUgZ3JhcGggbGV0cyB1cyBzZWUgdGhhdCB0aGUgR0RQIFBlciBDYXBpdGEgaGFzIGEgdmVyeSBsYXJnZSBtYXJnaW4sIGFzIG1vc3Qgb2YgdGhlIGNvdW50cmllcyBkbyBub3QgZXZlbiBtYWtlIGl0IHRvIHRoZSBmaXJzdCB0aWNrIG1hcmsgb2YgdGhlIGdyYXBoIHNob3dpbmcgbWFueSBvdXRsaWVyIGNvdW50cmllcyBpbiB0ZXJtcyBvZiBHRFAuDQoNCg0KIyBBbmltYXRlZSBMaWZlIEV4cGVjdGFuY2llcyB2cyBJbmNvbWUgDQoNCmBgYHtyIGFuaW1hdGV9DQoNCnBsb3QubGlmZTwtQ291bnRyaWVzJGxpZmVFeHANCnBsb3QucG9wPC1Db3VudHJpZXMkcG9wDQpwbG90LnJlZ2lvbjwtQ291bnRyaWVzJGNvbnRpbmVudA0KcGxvdC5nZHA8LUNvdW50cmllcyRnZHBQZXJjYXANCnBsb3QueWVhcjwtQ291bnRyaWVzJHllYXINCg0KcGFsLklCTSA8LSBjKCIjMzMyMjg4IiwgIiMxMTc3MzMiLCAiIzAwNzJCMiIsIiNENTVFMDAiLCAiIzg4MjI1NSIpDQpwYWwuSUJNIDwtIHNldE5hbWVzKHBhbC5JQk0sIGMoIkFzaWEiLCAiRXVyb3BlIiwgIkFmcmljYSIsICJBbWVyaWNhcyIsICJPY2VhbmlhIikpDQoNCg0KZmlnIDwtIENvdW50cmllcyAlPiUNCiAgcGxvdF9seSgNCiAgICB4ID0gfnBsb3QuZ2RwLCANCiAgICB5ID0gfnBsb3QubGlmZSwgDQogICAgc2l6ZSA9IH4oMipsb2cocGxvdC5wb3ApLTExKV4yLA0KICAgIGNvbG9yID0gfnBsb3QucmVnaW9uLCANCiAgICBjb2xvcnMgPSBwYWwuSUJNLCAgICMgY3VzdG9tIGNvbG9ycw0KICAgICNtYXJrZXIgPSBsaXN0KHNpemUgPSB+KGxvZyhwb3ApLTEwKSwgIHNpemVtb2RlID0gJ2FyZWEnKSwNCiAgICBmcmFtZSA9IH5wbG90LnllYXIsICAgICAgIyB0aGUgdGltZSB2YXJpYWJsZSB0bw0KICAgICMgdG8gZGlzcGxheSBpbiB0aGUgaG92ZXINCiAgICB0ZXh0ID0gfnBhc3RlKCJDb3VudHJ5OiIsIENvdW50cnksDQogICAgICAgICAgICAgICAgICAiPGJyPkNvbnRpbmVudDoiLCBjb250aW5lbnQsDQogICAgICAgICAgICAgICAgICAiPGJyPlllYXI6IiwgeWVhciwNCiAgICAgICAgICAgICAgICAgICI8YnI+TGlmZUV4cDoiLCBsaWZlRXhwLA0KICAgICAgICAgICAgICAgICAgIjxicj5Qb3A6IiwgcG9wLA0KICAgICAgICAgICAgICAgICAgIjxicj5nZHBQZXJDYXA6IiwgZ2RwUGVyY2FwKSwNCiAgICBob3ZlcmluZm8gPSAidGV4dCIsDQogICAgdHlwZSA9ICdzY2F0dGVyJywNCiAgICBtb2RlID0gJ21hcmtlcnMnDQogICkNCmZpZyA8LSBmaWcgJT4lIA0KbGF5b3V0KCAgDQogICAgICAjIyMgVGl0bGUgDQogICAgICB0aXRsZSA9bGlzdCh0ZXh0ID0gIkxpZmUgRXhwZWN0YW5jeSB2cyBJbmNvbWUgaW4gMjAxNSIsIA0KICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlRpbWVzIE5ldyBSb21hbiIsICAjIEhUTUwgZm9udCBmYW1pbHkgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMTgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAicmVkIikpLCANCiAgICAgICMjIEF4ZXMgbGFiZWxzDQogICAgICAgICAgICAgeGF4aXMgPSBsaXN0KCANCiAgICAgICAgICAgICAgICAgICAgdGl0bGU9bGlzdCh0ZXh0ID0gJ0luY29tZScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gJ0FyaWFsJykpLA0KICAgICAgICAgICAgICAgICAgICB6ZXJvbGluZXdpZHRoID0gMiwgDQogICAgICAgICAgICAgICAgICAgIGdyaWRjb2xvciA9ICd3aGl0ZScpLCANCiAgICAgICAgICAgIHlheGlzID0gbGlzdCggDQogICAgICAgICAgICAgICAgICAgIHRpdGxlPWxpc3QodGV4dCA9ICdMaWZlIEV4cGVjdGFuY3knLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICdBcmlhbCcpKSwNCiAgICAgICAgICAgICAgICAgICAgemVyb2xpbmV3aWR0aCA9IDIsIA0KICAgICAgICAgICAgICAgICAgICBncmlkY29sb3IgPSAnd2hpdGUnKQ0KICAgIA0KICApDQoNCmZpZw0KYGBgDQoNCkJ5IGFuaW1hdGluZyB0aGUgZ3JhcGgsIHdlIGhhdmUgeWV0IGFub3RoZXIgZGltZW5zaW9uIGFkZGVkIHRvIG91ciAyLUQgZ3JhcGgsIHllYXIuIFdoaWxzdCBhbGwgb2YgdGhlIDIwMTUgY29uY2x1c2lvbnMgaG9sZCBtb3N0bHkgdGhlIHNhbWUsIHNvbWV0aGluZyBpbnRlcmVzdGluZyBhYm91dCB0aGUgeWVhciBmYWN0b3IgaXMgdGhhdCBHRFAgYW5kIGluY29tZSB3YXMgbm90IGFsd2F5cyBhbiBleHBvbmVudGlhbCByZWxhdGlvbnNoaXAuIEJ5IGluY3JlYXNpbmcgdGhlIHllYXJzIGFuZCBzdGFydGluZyBhdCBhIGJhc2UsIHdlIGNhbiBzZWUgaXQgdXNlZCB0byBiZSBtb3JlIG9mIGEgY2x1c3RlciBvZiBwb2ludHMgd2l0aG91dCBhIHJlYWwgcGF0dGVybiwgYW5kIHRoZSBjbG9zZXIgdG8gdGhlIHByZXNlbnQgd2UgZ2V0LCB0aGUgc3Ryb25nZXIgdGhhdCBleHBvbmVudGlhbCByZWxhdGlvbnNoaXAgZ2V0cy4NCg0KIyBMb29raW5nIGF0IHRoZSBtZWFuIHBvcHVsYXRpb24gc2l6ZSBhY3Jvc3MgQ29udGluZW50cyBpbiAyMDE1DQoNCmBgYHtyIGJveH0NCmJhcnBsb3RkYXRhID0gYWdncmVnYXRlKENvdW50cmllc18yMDE1Wyw2XSwgYnkgPSBsaXN0KENvdW50cmllc18yMDE1JGNvbnRpbmVudCksIEZVTiA9IG1lYW4pDQpwbG90X2x5KA0KICBkYXRhID0gYmFycGxvdGRhdGEsDQogICB4ID0gfkdyb3VwLjEsDQogICB5ID0gfngsDQogICB0eXBlID0gImJhciIsDQogICBuYW1lID0gIkF2ZXJhZ2UgUG9wdWxhdGlvbiBTaXplIGJ5IENvdW50cnkiLA0KICAgIyMgZ3JhcGhpYyBzaXplDQogICB3aWR0aCA9IDcwMCwNCiAgIGhlaWdodCA9IDQwMCkgJT4lDQogICAgbGF5b3V0KCB5YXhpcyA9IGxpc3QodGl0bGUgPSJNZWFuIiksDQogICAgICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQ29udGluZW50IiksDQogICAgICAgICAgICB0aXRsZSA9ICJBdmVyYWdlIFBvcHVsYXRpb24gU2l6ZSBieSBDb3VudHJ5IiwNCiAgICAgICAgICAgICAgICAgICMjIG1hcmdpbiBvZiB0aGUgcGxvdA0KICAgICAgbWFyZ2luID0gbGlzdCgNCiAgICAgICAgICAgICAgYiA9IDUwLA0KICAgICAgICAgICAgICBsID0gMTAwLA0KICAgICAgICAgICAgICB0ID0gMTIwLA0KICAgICAgICAgICAgICByID0gNTANCiAgICAgICkpDQpgYGANCg0KT3ZlcmFsbCwgSSB0aGluayBpdCBpcyBxdWl0ZSBoYXJkIHRvIGdhaW4gZXh0cmVtZWx5IHZhbHVhYmxlIGluZm9ybWF0aW9uIG91dCBvZiB0aGUgc2l6ZXMgb2YgbWFya3Mgb24gYSBzY2F0dGVyIHBsb3QsIHNvIEkgdGhvdWdodCBJIHdvdWxkIG1ha2UgdGhlIGJveCBwbG90IGZvciBtZWFuIHBvcHVsYXRpb24gc2l6ZSBwZXIgY29udGluZW50IHRvIGJldHRlciBzZWUgdGhpcyByZWxhdGlvbnNoaXAuIE92ZXJhbGwsIHdlIGdldCBhIGxvdCBtb3JlIGRhdGEgZnJvbSB0aGlzIGJveCBwbG90LiBXZSBjYW4gc2VlIHRoYXQgQXNpYSBoYXMgdGhlIGhpZ2hlc3QgYXZlcmFnZSBwb3B1bGF0aW9uIHNpemUsIE9jZWFuaWEgaGFzIHRoZSBzbWFsbGVzdCwgYW5kIEFmcmljYSBhbmQgRXVyb3BlIGhhdmUgcXVpdGUgc2ltaWxhciBhdmVyYWdlcy4NCg0K